package br.fatec.ads.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.fatec.ads.connection.DataSource;
import br.fatec.ads.exception.CandidaturaRespostaException;
import br.fatec.ads.exception.DataBaseException;
import br.fatec.ads.model.Candidatura;
import br.fatec.ads.model.CandidaturaPK;
import br.fatec.ads.model.CandidaturaResposta;
import br.fatec.ads.model.Pergunta;
import br.fatec.ads.model.Resposta;
import br.fatec.ads.model.RespostaPK;
import br.fatec.ads.model.VagaPergunta;
import br.fatec.ads.model.VagaPerguntaPK;

/**
 * Classe intermediaria entre o modelo e o banco de dados 
 */
public class CandidaturaRespostaDAO {
	private static CandidaturaRespostaDAO candidaturaRespostaDAO;
	private static String INCLUIR_CANDIDATURA_RESPOSTA = "EXEC P_CANDIDATURA_RESPOSTA_INCLUIR ?, ?, ?, ?, ?";
	private static String CONSULTAR_CANDIDATURA_RESPOSTA = "EXEC P_CANDIDATURA_RESPOSTA_CONSULTAR ?, ?, ?";
	private static String LISTAR_CANDIDATURA_RESPOSTA = "EXEC P_CANDIDATURA_RESPOSTA_LISTAR ?, ?, ?";
	private static String LISTAR_CANDIDATURA_RESPOSTA_PERGUNTA = "EXEC P_CANDIDATURA_RESPOSTA_PERGUNTA_LISTAR ?";
	
	private CandidaturaRespostaDAO() {
		super();
	}
	
	public static CandidaturaRespostaDAO getInstance(){
		if(candidaturaRespostaDAO == null){
			candidaturaRespostaDAO = new CandidaturaRespostaDAO();
		}
		
		return candidaturaRespostaDAO;
	}
	
    public void incluirCandidaturaResposta(CandidaturaResposta candidaturaResposta) throws CandidaturaRespostaException, DataBaseException{
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(INCLUIR_CANDIDATURA_RESPOSTA);

                int i = 0;
                query.setInt(++i, candidaturaResposta.getVagaPergunta().getIdVagaPergunta());
                query.setInt(++i, candidaturaResposta.getCandidatura().getIdCandidatura());
                query.setInt(++i, candidaturaResposta.getResposta().getIdResposta());
                query.setString(++i, candidaturaResposta.getDescResposta());
                query.setString(++i, candidaturaResposta.getUsuario());
                
                query.executeUpdate();
            }catch(SQLException cause){
                throw new CandidaturaRespostaException("Problemas ao INSERIR a Candidatura Resposta!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        } catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
    

    public CandidaturaResposta getCandidaturaResposta(CandidaturaResposta candidaturaResposta) throws CandidaturaRespostaException, DataBaseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	CandidaturaResposta candResposta = null;
    	
    	try{
    		try{
    			candResposta = new CandidaturaResposta();
    			
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(CONSULTAR_CANDIDATURA_RESPOSTA);
    			
    			int i = 0;
    			query.setInt(++i, candidaturaResposta.getVagaPergunta().getIdVagaPergunta());
    			query.setInt(++i, candidaturaResposta.getCandidatura().getIdCandidatura());
    			query.setInt(++i, candidaturaResposta.getResposta().getIdResposta());
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				
    				VagaPergunta vagaPergunta = new VagaPergunta();
    				vagaPergunta.setIdVagaPergunta(resultSet.getInt("IDVAGAPERGUNTA"));
    				
    				Candidatura candidatura = new Candidatura();
    				candidatura.setIdCandidatura(resultSet.getInt("IDCANDIDATURA"));
    				
    				Resposta resposta = new Resposta();
    				resposta.setIdResposta(resultSet.getInt("IDRESPOSTA"));
    				
    				candResposta.setVagaPergunta(vagaPergunta);
    				candResposta.setCandidatura(candidatura);
    				candResposta.setResposta(resposta);
    				candResposta.setDescResposta(resultSet.getString("DESCRESPOSTA"));
    				candResposta.setUsuario(resultSet.getString("USUARIOINCLUSAO"));
    				candResposta.setDataHora(resultSet.getTimestamp("DTHRINCLUSAO"));
    			}
    		}catch (SQLException cause) {
    			throw new CandidaturaRespostaException("Problemas ao CONSULTAR a Candidatura Resposta!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	
    	return candidaturaResposta;
    }
    
    public List listarCandidaturaResposta(CandidaturaResposta candidaturaResposta) throws CandidaturaRespostaException, DataBaseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	List listaCandidaturaResposta = new ArrayList();
    	
    	try{
    		try{
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(LISTAR_CANDIDATURA_RESPOSTA);
    			
    			int i = 0;
    			query.setInt(++i, candidaturaResposta.getVagaPergunta().getIdVagaPergunta());
    			query.setInt(++i, candidaturaResposta.getCandidatura().getIdCandidatura());
    			query.setInt(++i, candidaturaResposta.getResposta().getIdResposta());
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				CandidaturaResposta candResposta = new CandidaturaResposta();
    				
    				VagaPergunta vagaPergunta = new VagaPergunta();
    				vagaPergunta.setIdVagaPergunta(resultSet.getInt("IDVAGAPERGUNTA"));
    				
    				Candidatura candidatura = new Candidatura();
    				candidatura.setIdCandidatura(resultSet.getInt("IDCANDIDATURA"));
    				
    				Resposta resposta = new Resposta();
    				resposta.setIdResposta(resultSet.getInt("IDRESPOSTA"));
    				
    				candResposta.setVagaPergunta(vagaPergunta);
    				candResposta.setCandidatura(candidatura);
    				candResposta.setResposta(resposta);
    				candResposta.setDescResposta(resultSet.getString("DESCRESPOSTA"));
    				candResposta.setUsuario(resultSet.getString("USUARIOINCLUSAO"));
    				candResposta.setDataHora(resultSet.getTimestamp("DTHRINCLUSAO"));
    				
    				listaCandidaturaResposta.add(candResposta);
    			}
    		}catch (SQLException cause) {
    			throw new CandidaturaRespostaException("Problemas ao LISTAR a Candidatura Resposta!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	
    	return listaCandidaturaResposta;
    }
    
    public List listarCandidaturaRespostaPergunta(int idCandidatura) throws CandidaturaRespostaException, DataBaseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	List listaCandidaturaResposta = new ArrayList();
    	CandidaturaResposta candidaturaResposta;
    	Pergunta pergunta;
    	Resposta resposta;
    	Resposta[] respostas;
    	VagaPergunta vagaPergunta;
    	
    	try{
    		try{
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(LISTAR_CANDIDATURA_RESPOSTA_PERGUNTA);
    			
    			int i = 0;
    			query.setInt(++i, idCandidatura);
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				candidaturaResposta = new CandidaturaResposta();
    				pergunta = new Pergunta();
    				resposta = new Resposta();
    				respostas = new Resposta[1];
    				vagaPergunta = new VagaPergunta();
    				
    				pergunta.setIdPergunta(resultSet.getInt("IDPERGUNTA"));
    				pergunta.setDescPergunta(resultSet.getString("DESCPERGUNTA"));
    				pergunta.setTipoPergunta(resultSet.getString("TIPOPERGUNTA"));
    				pergunta.setObrigatorio(resultSet.getString("OBRIGATORIO"));
    				
    				resposta.setIdResposta(resultSet.getInt("IDRESPOSTA"));
    				
    				if(resposta.getIdResposta() == 0){
    					resposta.setDescResposta(resultSet.getString("DESCRESPOSTAUSUARIO") == null ? "" : resultSet.getString("DESCRESPOSTAUSUARIO"));
    				}else{
    					resposta.setDescResposta(resultSet.getString("DESCRESPOSTA") == null ? "" : resultSet.getString("DESCRESPOSTA"));
    				}
    				
    				respostas[0] = resposta;
    				pergunta.setRespostas(respostas);
    				vagaPergunta.setPergunta(pergunta);
    				candidaturaResposta.setVagaPergunta(vagaPergunta);
    				
    				listaCandidaturaResposta.add(candidaturaResposta);
    			}
    		}catch (SQLException cause) {
    			throw new CandidaturaRespostaException("Problemas ao LISTAR a Respostas do Candidato!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	
    	return listaCandidaturaResposta;
    }
}